package com.ys.io.IO流.p4字节输入l流;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;

/**
 * 描述:
 *  FileInputStream了解与使用 : FileInputStream 是用来读文件的,把磁盘文件读到内存(程序中)
 *  CTRL +B 进入源码
 * @author CodeYang
 * @version 2020/12/30 9:33
 */
public class FileInputStream了解与使用 {
    public static void main(String[] args) throws UnsupportedEncodingException {
        byte[] bytes = "中".getBytes("UNICODE");
        // 1 byte = 8 bit
        System.out.println(Arrays.toString(bytes).length());

        //method01();
        //method02();
        //method03();
        method04();
    }
    /**
    *描述:
     * 使用循环读取数据
     *  场景：循环去读取读取aaaaa.txt文件所有的数据，当读取到-1终止循环(停止读取操作)
     *  * 步骤：
     *  * 1 定义try with resources
     *  * 2 在try with resources里面创建FileInputStream对象，并且指定磁盘文件的路径
     *  * 3 定义变量存储读取的数据
     *  * 4 使用while循环读取磁盘的数据，读取到程序末尾停止读取
     *  * 注意：此时调用无参的read()方法来读取
    */
    private static void method04() {
        try (InputStream fis = new FileInputStream("day_22/aa.txt")) {
           int data = 0;

            while ((data = fis.read())!=-1){
                System.out.print(data+" | ");
            }


        }catch (Exception e){

        }
    }

    /**
     * 描述: 一次读取多个字节数据 red
     * * 场景：使用FileInputStream流一次读取多个字节的数据，需要用到read(byte[]data)方法
     *  * 步骤：  1 定义try with resources
     *  *        2 在try with resources里面创建FileInputStream对象，并且指定磁盘文件的路径
     *  *        3 调用 read(byte[]data)方法读取多个bytes，将读取的结果保存到字节数组data中
     *  *        4 打印读取的结果
    */
    private static void method03() {
        try (InputStream fis = new FileInputStream("day_22/aa.txt")) {
            byte[] data = new byte[4];


            int length = fis.read(data);
            // 1[45, 49, 50, 51]len:4
            System.out.println(Arrays.toString(data)+"len:"+length);
            length = fis.read(data);
            //2[52, 53, 54, 55]len:4
            System.out.println(Arrays.toString(data)+"len:"+length);
            length = fis.read(data);
            //[56, 57, 49, 48]len:4
            System.out.println(Arrays.toString(data)+"len:"+length);


        }catch (Exception e){

        }
    }

    /**
    * 描述 :
     * length 表示的是有效字节树,read(byte[]) 只把有 文件末尾(-1)之前的内容返回给数组, 数组其他内容为默认值
     *    一次读取多个多个文件返回给byte数组
     *  * 场景：使用FileInputStream流一次读取多个字节的数据，需要用到read(byte[]data)方法
     *  * 步骤：  1 定义try with resources
     *  *        2 在try with resources里面创建FileInputStream对象，并且指定磁盘文件的路径
     *  *        3 调用 read(byte[]data)方法读取多个bytes，将读取的结果保存到字节数组data中
     *  *        4 打印读取的结果
    */
    private static void method02() {
        try (InputStream fileInputStream = new FileInputStream("day_22/aa.txt")) {
            byte[] arr = new byte[4];
            // length 表示的是有效字节树,read(byte[]) 只把有 文件末尾(-1)之前的内容返回给数组,
            // aa.txt -> abc 所以 byte 被赋值内容为:[97, 98, 99, 0]len:3 实际长度为3 没有赋值的内容为默认值
            int length = fileInputStream.read(arr);

            System.out.println(Arrays.toString(arr)+"len:"+length);


        }catch (Exception e){

        }
    }

    /***
    * 描述 :read();  读取文件内容,返回对应的ASCII码值,到文件尾返回-1
    *场景：当前工程下有一个文件aaaaa.txt，我使用FileInputStream流对象从磁盘读取数据，然后将读取的结果打印到控制台
     *  * 步骤：1 定义try with resources
     *  *      2 在try with resources里面创建FileInputStream对象，并且指定磁盘文件的路径
     *  *      3 调用read()方法读取数据
    */
    private static void method01() {

        try (InputStream fileInputStream = new FileInputStream("day_22/aaaa.txt")) {
            // 依次读取,返回对应的ASCII码值,读到文件末返回-1
            int read = fileInputStream.read();
            int read2 = fileInputStream.read();
            // aaaa.txt - a

            System.out.println(read); // 97
            System.out.println(read2); // -1

        }catch (Exception e){

        }

    }

}
